package com.ruoyi.common.utils.minio;

import com.ruoyi.common.config.MinioConfig;
import com.ruoyi.common.utils.DateUtils;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import io.minio.errors.*;
import jdk.nashorn.internal.runtime.regexp.joni.exception.InternalException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

@Component
public class MinioUtils {
    @Autowired
    private MinioConfig minioConfig;

    /**
     * 实现上传图片到Minio
     */
    public Map<String, String> upload(MultipartFile file) throws IOException, NoSuchAlgorithmException, InternalException, ServerException, InsufficientDataException, ErrorResponseException, InvalidKeyException, InvalidResponseException, XmlParserException, io.minio.errors.InternalException {
        //获取Minio的配置参数
        String endpoint = minioConfig.getEndpoint();
        String accessKey = minioConfig.getAccessKey();
        String secretKey = minioConfig.getSecretKey();
        String bucketName = minioConfig.getBucketName();
        // 获取上传的文件的输入流
        InputStream inputStream = file.getInputStream();

        //将文件上传到Minio中
        //1.获取minio对象
        MinioClient minioClient = MinioClient.builder().endpoint(endpoint).credentials(accessKey, secretKey).build();
        // 检查存储桶是否已经存在
        boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        if (!isExist) {
            // 创建一个名为 huike-crm 的存储桶，用于存储照片的zip文件。
            minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
        }

        // 避免文件覆盖 生成日期文件夹格式+文件 ：年/月 + 文件名
        String originalFilename = file.getOriginalFilename(); //获取原始文件名
        //拼接生成新的UUID形式的文件名
        String dir = DateUtils.dateMonPath();
        String fileMinoName = UUID.randomUUID().toString().replaceAll("-", "") + originalFilename.substring(originalFilename.lastIndexOf("."));
        String objectName = dir + fileMinoName;
        //2.通过Minio对象将图片上传到minio桶中
        // 使用putObject上传一个文件到存储桶中。
        PutObjectArgs objectArgs = PutObjectArgs.builder().object(objectName)
                .bucket(bucketName)
                .contentType(file.getContentType())
                .stream(inputStream, file.getSize(), -1).build();
        minioClient.putObject(objectArgs);
        //组装桶中文件的访问url
        String resUrl = endpoint + "/" + bucketName  + objectName;
        Map<String, String> valueMap = new HashMap<>();
        valueMap.put("url", resUrl);
        valueMap.put("fileName", fileMinoName);
        return valueMap;
    }


}
